﻿//==============================================================================
// File: IContainerFacade.cs
// Created: 2010-06-07
// Author: Piotr Włodek, Arkadiusz Świerczek
//==============================================================================
// This file is a part of MAMMOTH project.
// Copyright (C) 2010 AGH University of Science and Technology, Krakow.
// https://caribou.iisg.agh.edu.pl/trac/mammoth
//
// Mammoth is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// 
// Mammoth is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU Lesser General Public License for more details.
// 
// You should have received a copy of the GNU Lesser General Public License
// along with Mammoth. If not, see http://www.gnu.org/licenses/.
//==============================================================================

using System;
using System.Collections.Generic;

namespace WpfRcp.Core.Services
{
    public interface IContainerFacade
    {
        T Resolve<T>();
        
        T Resolve<T>(string name);

        object Resolve(Type type);
        
        object Resolve(Type type, string name);

        IEnumerable<T> ResolveAll<T>();
        
        IEnumerable<object> ResolveAll(Type type);

        IContainerFacade Register<TFrom, TTo>() where TTo : TFrom;
        
        IContainerFacade Register<TFrom, TTo>(string name) where TTo : TFrom;
        
        IContainerFacade Register<TFrom, TTo>(string name, LifetimePolicy policy) where TTo : TFrom;
        
        IContainerFacade Register<TFrom, TTo>(LifetimePolicy policy) where TTo : TFrom;

        IContainerFacade Register(Type from, Type to);
        
        IContainerFacade Register(Type from, Type to, string name);
        
        IContainerFacade Register(Type from, Type to, string name, LifetimePolicy policy);
        
        IContainerFacade Register(Type from, Type to, LifetimePolicy policy);

        IContainerFacade RegisterInstance<TFrom>(TFrom instance);
        
        IContainerFacade RegisterInstance<TFrom>(string name, TFrom instance);

        IContainerFacade RegisterInstance(Type type, object instance);
        
        IContainerFacade RegisterInstance(Type type, string name, object instance);
        
        IContainerFacade CreateChildContainer();
        
        IContainerFacade Parent { get; }

        IContainerFacade BuildUp(object instance);
        
        bool IsTypeRegistered<TType>();
        
        bool IsTypeRegistered(Type type);
    }

    public enum LifetimePolicy
    {
        Singleton,
        Transient,
        PerThread
    }
}